"""
@project:python起步.py
@author:zhujiahui
@IDE:PyCharm
@time:2021-07-16-11:46
@Introduction:
"""
# 1、用户密码复杂度验证(封装成函数)
#     长度超过8位(必须)——+1分
#     包括大、小写字母数字其它符号,以上四种至少三种——+1分
#     不能有长度超过或等于3的子串重复——+1分
#     密码的评分等级,默认2分,以上条件满足一条——+1分
#     返回密码的评分等级，及要改进的点:（如return 3, [长度小于8', '密码没有由3种以上字符组成]）

def iflength(str):
    """
    传入密码及当前分数，并对长度进行判断
    """
    if len(str) > 8:
        global grade
        grade += 1
        #     返回1，表示长度符合标准，加1分
        return 1
    else:
        #     返回0，表示长度不达标，不加分，并且需要输出
        return 0


def iftype(str):
    """
    传入密码，并对密码包含类型进行判断，函数返回1表示类型符合，返回0表示不符合
    """
    # 定义一个总的包含类型数量，以及四个变量对类型有无进行判断
    #字母
    sub = 0
    #小写字母
    swindex = 0
    #大写字母
    bwindex = 0
    #数字
    numindex = 0
    #特殊字符
    otherindex = 0

    for i in range(0, len(str)):
        if ord(str[i]) >= 65 and ord(str[i]) <= 90:#判断是否为小写字母
            bwindex = 1
        elif ord(str[i]) >= 97 and ord(str[i]) <= 122:#判断是否大写字母
            swindex = 1
        elif ord(str[i]) >= 48 and ord(str[i]) <= 57:#判断是否为数字
            numindex = 1
        else:
            otherindex = 1#其他字符
    sub = swindex + bwindex + numindex + otherindex
    # 如果大于三种则分数+1
    if sub >= 3:
        global grade
        grade += 1
        return 1
    # 如果不满足，则返回0
    else:
        return 0


def ifsame(str):
    '''
    传入密码，对密码是否有超过或等于3的重复子串进行判断
    '''
    a = []
    for i in range(len(str)):
        for j in range(i + 3, len(str) + 1):
            a.append(str[i:j])
    for m in range(len(a)):
        for n in range(m + 1, len(a)):
            if a[m] == a[n]:
                return 0
    global grade
    grade += 1
    return 1

# 主程序，控制台输入密码str，进行长度，类型，重复子串判断之后输出安全等级及具体问题
print("请输入您要设置的密码，按enter键提交：")
str = input()
grade = 2
print("您设置的密码长度为（1：符合安全系数，0：不符合安全系数）:",iflength(str))
print("您设置的密码所含字符种类为（1：大于等于三种符合安全系数，0：不符合安全系数）:",iftype(str))
print("您设置的密码连续重复长度为（1：小于3个重复，符合安全系数，0：不符合安全系数）:",ifsame(str))
output = "您的安全等级是 {} 级,"
print(output.format(grade),end='')
a = []
if (iflength(str)) == 0:
    a.append('长度小于8')
if (iftype(str)) == 0:
    a.append('密码没有由三种以上字符组成')
if (ifsame(str)) == 0:
    a.append('有长度超过或等于3的子串重复')
if (iflength(str)) == (iftype(str)) == (ifsame(str)) ==1:
    print("您的密码符合要求，很安全")
else:
    print('您的安全问题有：',end='')
    print(a)


#知识点
# string=input("请输入一个包含字符串:")
# def strInNumber(str):
#     number=0#数字
#     letter=0#字母
#     blank=0#空格
#     other=0#其他
#     for i in range(0,len(str)):#判断字符是否为数字
#         if ord(str[i])>=48 and ord(str[i])<=57:
#             number+=1
#         elif (ord(str[i])>65 and ord(str[i])<=90) or (ord(str[i])>=97 and ord(str[i])<=122):#判断字符是否为字母
#             letter+=1
#         elif ord(str[i])==32:#判断字符是否为空格
#             blank+=1
#         else:
#             other+=1
#     print("该字符串中数字有%d个,字母%d个,空格%d个,其他的%d个." % (number, letter, blank, other))
#     # return number,letter,blank,other
